Chatbotでロググループを100個以上表示できずにハマったので調査してみた
結論
100個以上表示できません
はじめに
ChatbotでSlack通知の際に表示される以下のようなアクションについての記事です。
QueryLogs アクションでCloudWatch Logsの一覧が100件までしか取得できず、回避策がないか調査しました。
Chatbotの導入はAWSを利用しているプロジェクトであれば行うことが機会が多いです。毎回細かい設定など忘れがちなので今回の調査も備忘のために残しておきます。
なお、本記事はかなり細かい挙動について書いているので、執筆現在(2024/07/17)から挙動が修正される可能性があります。最新情報は自身の環境でご確認ください。
問題となった挙動を再現
問題となった挙動を再現します。
取得できるCloudWatch Logsが100件であることを確認するため、100個以上のロググループを作成します。
#!/bin/bash
# リージョンとプロファイルの設定
REGION="ap-northeast-1"
PROFILE="<プロファイル名を設定する>"
# 101個のLogグループを作成
for i in $(seq 1 101)
do
LOG_GROUP_NAME="log-group-$i"
aws logs create-log-group --log-group-name $LOG_GROUP_NAME --region $REGION --profile $PROFILE
if [ $? -eq 0 ]; then
echo "Created log group: $LOG_GROUP_NAME"
else
echo "Failed to create log group: $LOG_GROUP_NAME"
fi
done
元々あったロググループも含め、合計で147個のロググループが存在する環境を用意できました。
CloudWatch Metrics, CloudWatch Alarm, SNS, ChatBotを作成します。(作成の様子は割愛)
Slackへ通知を送り、ログ一覧を確認してみます。
今回作成したロググループが一部取得出来ていません。
また、ロググループ名を入力しても表示できません。
調査
結論: 100件以上表示することは出来ず、取得するロググループ一覧を絞ることもできない。
IAMポリシーを制限することで必要なロググループのみ表示できるか確認
100件の中に本当に必要なログがあれば良いので、取得するロググループを絞れないか検討しました。
前提として、Chatbotでログ一覧を取得するには、Chatbotのロールに権限を付与する必要があります。
logs:DescribeLogGroupsというアクションを許可することで、ロググループの一覧を取得できます。
Chatbotをマネジメントコンソールから作成すると以下のようなIAMポリシーが紐づいています。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"cloudwatch:Describe*",
"cloudwatch:Get*",
"cloudwatch:List*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
こちらのポリシーの "Resource": "*"
の箇所で "Resource": "<クエリしたいロググループ一覧>"
と絞ることにより、本当に必要なロググループを表示できないか検討しました。
結果、こちらは不可能でした。
理由としては、 logs:DescribeLogGroups
のアクションは"Resource": "*"
を必ず指定しなければいけないためです。
IAMポリシーのビジュアルエディタでも以下のように確認できます。
感想
Chatbotのアクションについては挙動が不明な点が多いので、調査も少し苦労しました。
AWS CLI で aws logs describe-log-groups
のようにログ名を取得しても100件以上取得できるので、100という制限はChatbotの内部実装に起因するものだと推測できます。
Chatbotのアクションを完全に用途に合わせてカスタマイズするのは少し難しいので、障害調査の中では一次調査のために軽く動作させるもの、と考えた方がよさそうです。
どうしてもSlack上で複雑な調査を行いたい場合、アクションを色々頑張って弄るよりも、素直にChatbotにAWS CLIを実行してもらうのが良さそうです。